package modele;

import java.util.SortedSet;
import java.util.TreeSet;

import java.io.Writer;

import java.rmi.server.UnicastRemoteObject;

public class UniteEnseignementImpl extends UnicastRemoteObject implements UniteEnseignement {

	/**
	 * 
	 */
	private static final long serialVersionUID = 4L;
	static int numero = 0;

	Integer ident;
	Object[] info = new Object[9];
	SortedSet<Dossier> demandes;
	SortedSet<Dossier> propositions;
	//	SortedSet<UniteEnseignement> incompatibles;

	/**
	 *	Pour la creation d'une UE a partir de l'importation d'un fichier
	 *  Le format du fichier :
	 *  Nom; Acronyme; code Apogee; Quota
	 **/
	public UniteEnseignementImpl(String[] uneUE) throws Exception {
		ident = new Integer(numero++);

		setIntitule(uneUE[0]);
		setSigle(uneUE[1]);
		setApogee(uneUE[2]);

		info[3] = new Integer(uneUE[3]);
		info[4] = new TreeSet<Parcours>(new ComparatorParcours()); // obligatoire
		info[5] = new TreeSet<Parcours>(new ComparatorParcours()); // choix 1
		info[6] = new TreeSet<Parcours>(new ComparatorParcours()); // choix 2
		demandes = new TreeSet<Dossier>(new ComparatorDossier());
		propositions = new TreeSet<Dossier>(new ComparatorDossier());
		//		incompatibles = new TreeSet<UniteEnseignement>(new ComparatorUE());
	}

	// les methodes statiques
	static public int getNumero() throws Exception {
		return numero;
	}

	static public void setNumero(int max) throws Exception {
		numero = max;
	}

	// les assesseurs
	public void setIntitule(String nom) throws Exception {
		info[0] = new String(nom);
	}

	public void setSigle(String nom) throws Exception {
		info[1] = new String(nom);
	}

	public void setApogee(String nom) throws Exception {
		info[2] = new String(nom);
	}

	public void setQuota(int nb) throws Exception {
		info[4] = new Integer(Math.max(nb,0));
	}

	public Integer getIdent() throws Exception {
		return ident;
	}

	public String getIntitule() throws Exception {
		return (String)info[0];
	}

	public String getSigle() throws Exception {
		return (String)info[1];
	}

	public String getApogee() throws Exception {
		return (String)info[2];
	}

	public Integer getQuota() throws Exception {
		return (Integer)info[3];
	}

	public Object[] getObjet() throws Exception {
		info[7] = new Integer(demandes.size());
		info[8] = new Integer(propositions.size());
		return info;
	}

	public String[] getInfo() throws Exception {
		Object[] aux = getObjet();
		String[] info = new String[aux.length];
		for (int i=0; i<aux.length; i++)
			info[i] = aux[i].toString();
		return info;
	}

	@SuppressWarnings("unchecked")
	public SortedSet<Parcours> getParcoursObligatoire() throws Exception {
		return (SortedSet<Parcours>)info[4];
	}

	@SuppressWarnings("unchecked")
	public SortedSet<Parcours> getParcoursChoix1() throws Exception {
		return (SortedSet<Parcours>)info[5];
	}

	@SuppressWarnings("unchecked")
	public SortedSet<Parcours> getParcoursChoix2() throws Exception {
		return (SortedSet<Parcours>)info[6];
	}

	public SortedSet<Dossier> getDemandes() throws Exception {
		return demandes;
	}

	public SortedSet<Dossier> getPropositions() throws Exception {
		return propositions;
	}

	//	public SortedSet<UniteEnseignement> getIncompatibles() throws Exception {
	//		return incompatibles;
	//	}

	@SuppressWarnings("unchecked")
	public boolean addObligatoire(Parcours p) throws Exception {
		return ((SortedSet<Parcours>)info[4]).add(p);
	}

	@SuppressWarnings("unchecked")
	public boolean addChoix1(Parcours p) throws Exception {
		return ((SortedSet<Parcours>)info[5]).add(p);
	}

	@SuppressWarnings("unchecked")
	public boolean addChoix2(Parcours p) throws Exception {
		return ((SortedSet<Parcours>)info[6]).add(p);
	}

	//	public boolean addIncompatible(UniteEnseignement e) throws Exception {
	//		return incompatibles.add(e);
	//	}

	public boolean addDemande(Dossier e) throws Exception {
		return demandes.add(e);
	}

	public boolean addProposition(Dossier e) throws Exception {
		if (propositions.size()<getQuota().intValue()){
			return propositions.add(e);
		}
		return false;
	}

	@SuppressWarnings("unchecked")
	public boolean removeObligatoire(Parcours p) throws Exception {
		return ((SortedSet<Parcours>)info[4]).remove(p);
	}

	@SuppressWarnings("unchecked")
	public boolean removeChoix1(Parcours p) throws Exception {
		return ((SortedSet<Parcours>)info[5]).remove(p);
	}

	@SuppressWarnings("unchecked")
	public boolean removeChoix2(Parcours p) throws Exception {
		return ((SortedSet<Parcours>)info[6]).remove(p);
	}

	public boolean removeDemande(Dossier e) throws Exception {
		return demandes.remove(e);
	}

	public boolean removeProposition(Dossier e) throws Exception {
		return propositions.remove(e);
	}

	//	public boolean removeIncompatible(UniteEnseignement ue) throws Exception {
	//		return incompatibles.remove(ue);
	//	}

	public void clearPropositions() throws Exception {
		propositions.clear();
	}

	public void clearDemandes() throws Exception {
		demandes.clear();
	}

	//	public void clearIncompatibles() throws Exception {
	//		incompatibles.clear();
	//	}
	//
	//	public boolean isCompatible(Set<UniteEnseignement> ues) throws Exception {
	//		for (UniteEnseignement uei : ues){
	//			if (incompatibles.contains(uei))
	//				return false;
	//		}
	//		return true;
	//	}

	public String toString() {
		return (String)info[1]+"("+(String)info[2]+")";
	}

	public void imprimerAvecContraintes(Writer file) throws Exception {
		SortedSet<UniteEnseignement> ues = new TreeSet<UniteEnseignement>(new ComparatorUE());
		int[] uesNb = new int[UniteEnseignementImpl.getNumero()];
		for (int i=0; i<uesNb.length; i++)
			uesNb[i] = 0;
		file.write("\\newpage\n"+
				"\\subsection*{"+getIntitule()+
				" ("+getApogee()+
				" ) : ("+propositions.size()+" inscrits)}\n");
		SortedSet<Dossier> aux = new TreeSet<Dossier>(new ComparatorDossierNom());
		for (Dossier dos : propositions)
			aux.add(dos);

		file.write("%\\begin{minipage}[t]{.45\\textwidth}\n"+
				"\\begin{small}\n"+
				"\\begin{longtable}{lllc}\n"+
				"\\caption*{Les \\'etudiants}\n"+
		"\\endhead\n\\hline\n");
		for (Dossier dos : aux) {
			file.write(dos.getEtudiant().getNom()+"&"+
					dos.getEtudiant().getPrenom()+"&"+
					dos.getEtudiant().getEtablissementOrigine()+"&"+
					dos.getProposition().getParcours().getSigle()+"\\\\\n");
			for (UniteEnseignement ue : dos.getProposition().getParcours().getUeObligatoires()) {
				ues.add(ue);
				uesNb[ue.getIdent().intValue()]++;
			}
			for (UniteEnseignement ue : dos.getProposition().getUesChoix1()) {
				ues.add(ue);
				uesNb[ue.getIdent().intValue()]++;
			}
			for (UniteEnseignement ue : dos.getProposition().getUesChoix2()) {
				ues.add(ue);
				uesNb[ue.getIdent().intValue()]++;
			}
		}
		file.write("\\end{longtable}\n"+
				"\\end{small}\n"+
		"%\\end{minipage}");
		ues.remove(this);

	}

	public void imprimer(Writer file) throws Exception {
		if(propositions.size()==0)
			file.write("\\rowcolor{red}");
		else if(propositions.size()<10)
			file.write("\\rowcolor{yellow}");
		else if(propositions.size()==10)
			file.write("\\rowcolor{cyan}");
		
		file.write(getIntitule()+"&"+
				getSigle()+"&"+
				getQuota()+"&\\begin{minipage}{3cm}"+
				getParcoursObligatoire()+"\\end{minipage}&\\begin{minipage}{3cm}"+
				getParcoursChoix1()+"\\end{minipage}&"+
				getParcoursChoix2()+"&"+
				propositions.size()+"\\\\\\hline\n");
	}

}
